# -*- coding: utf-8 -*-

# slice 切片
names = ['bob', 'dave', '黄海波', '陈冠希']
# 取前三个元素
print(names[0:3])
# 去后面两个 最后一个是-1
print(names[-2:-1])

number = [0, 5, 10, 15, 20, 25, 30, 35, 40,
          45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

# 前十个 每两个取一个
print(number[:10:2])
# 所有数 没5个取一个
print(number[::5])





# 迭代 迭代前应该判断是否是一个可迭代对象 字符串也是个可迭代对象
map = {"dave": 100, "冠希哥": 90, "柳岩": "36D"}
# 迭代键和值
for k, v in map.items():
    print("键：", k, "值：", v)
# 迭代值
for v in map.values():
    print("值：", v)

# 带下标迭代
for i, v in enumerate(number):
    print("第", i, "个元素的值：", v)





# 列表生成
# 写列表生成式时，把要生成的元素x * x放到前面，后面跟for循环，就可以把list创建出来
a = [a+5 for a in range(0, 11)]
print(a)
# 可以带上if
a = [x * x for x in range(1, 11) if x % 2 == 0]
print(a)

# 双重for
a = [m*d for m in range(1, 13) for d in range(1, 32)]
print(a)





# generator生成器 不立即初始化 而是用的时候去推导 懒加载
L = [x * x for x in range(10)]
# generator 方式
g = (x * x for x in range(10))

# 访问单个generator
print(next(g))
# 迭代
for v in g:
    print(g)

#generator函数 返回的是个generator对象 遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行。

def generator_func():
    for i in range(5):
        #遇到yield 返回
        yield(i+1)
    return

g=generator_func()
#调用generator
for i in g:
    print(i)



#判断元素是否可以迭代 list tulp dict str都是Iterable
from collections import Iterable
a=[x for x in range(10)]
print("a是一个可迭代对象吗：",isinstance(a,Iterable))
# 可以被next()函数调用并不断返回下一个值的对象称为迭代器：Iterator。 generator是个Iterator 是惰性的

#把list、dict、str等Iterable变成Iterator可以使用iter()函数：
a=iter(a)
from collections import Iterator
print("a是一个Iterator:",isinstance(a,Iterator))




